package vt;

import java.sql.*;
import java.util.ArrayList;
import java.util.Stack;
import siniflar.*;

/**
 * Veritabanı ile ilgili işlemler için bir ara sınıf. Tüm veritabanı ile ilgili
 * işlemler bu sınıfta tanımlı metodlar yardımıyla gerçekleştirilir.
 */
public class Veritabani implements Ayarlar {

    private Connection baglanti = null;

    public Veritabani() {
    }

    public void baglan() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException cnfe) {
            System.out.print("Veritabani surucusu ile ilgili hata olustu");
        }
        try {
            baglanti = DriverManager.getConnection(VTADRES, VTKULLANICI, VTSIFRE);
        } catch (SQLException sqe) {
            System.out.print("Veritabaniyla baglanti kurulamadi");
        }
        
        if(baglanti==null)
        {
            System.out.print("Veritabaniyla baglanti kurulamadi");
        }
    }

    public void baglantiKes() {
        if (baglanti != null) {
            try {
                baglanti.close();
            } catch (SQLException e) {
                System.err.println("Veritabani baglantisi kesilemedi");
            }
        }
    }

    /**
     * Öğrenci kullanıcısının sisteme girişi için kullanılan metot. Argümanlara
     * göre veritabanına yapılan sorgu sonuçları kullanılarak
     * {@link Ogrenci} tipinde bir nesne oluşturulur.
     *
     * @param ogrno Öğrenci numarası
     * @param sifre Öğrenci şifresi
     *
     * @return Veritabanından çekilen bilgilerle oluşturulan {@link Ogrenci}
     * tipinde nesne döndürülür. Eğer hata oluşursa {@code null} döndürülür.
     */
    public Ogrenci ogrenciGiris(String ogrno, String sifre) {
        Statement sorgu = null;
        Ogrenci ogrenci = null;

        String girisSorgu = "select * from ogrenci where ogrencino=" + ogrno + " and sifre=" + sifre + "";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(girisSorgu);
            while (rs.next()) {
                ogrenci = new Ogrenci();
                ogrenci.setId(rs.getInt("idogrenci"));
                ogrenci.setAd(rs.getString("adi"));
                ogrenci.setSoyad(rs.getString("soyadi"));
                ogrenci.setOgrenciNo(rs.getString("ogrencino"));
                ogrenci.setTckimlik(rs.getString("kimlikno"));
                ogrenci.setDanisman(ogretimUyesiVer(rs.getInt("danismanid")));
                ogrenci.setAnabilimDali(anabilimDaliVer(rs.getInt("anabilimid")));
                ogrenci.setKayitYili(rs.getInt("kayityili"));
                ogrenci.setIletisim(rs.getString("iletisim"));
                ogrenci.setSifre(rs.getString("sifre"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return ogrenci;

    }

    /**
     * Öğretim üyesi kullanıcısının sisteme girişi için kullanılan metot.
     * Argümanlara göre veritabanına yapılan sorgu sonuçları kullanılarak
     * {@link OgretimUyesi} tipinde bir nesne oluşturulur.
     *
     * @param sicilNo Öğretim üyesi sicil numarası
     * @param sifre Öğrenci şifresi
     *
     * @return Veritabanından çekilen bilgilerle oluşturulan {@link OgretimUyesi}
     * tipinde nesne döndürülür. Eğer hata oluşursa {@code null} döndürülür.
     */
    public OgretimUyesi ogretimGiris(String sicilNo, String sifre) {
        Statement sorgu = null;
        OgretimUyesi ogretim = null;

        String girisSorgu = "select * from ogretimuyesi where sicilno=" + sicilNo + " and sifre=" + sifre + "";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(girisSorgu);
            while (rs.next()) {
                ogretim = new OgretimUyesi();
                ogretim.setId(rs.getInt("idogretimuyesi"));
                ogretim.setAd(rs.getString("adi"));
                ogretim.setSoyad(rs.getString("soyadi"));
                ogretim.setTckimlik(rs.getString("kimlikno"));
                ogretim.setSicilNo(rs.getString("sicilno"));
                ogretim.setUnvan(unvanVer(rs.getInt("unvanid")));
                ogretim.setAnabilimDali(anabilimDaliVer(rs.getInt("anabilimid")));
                ogretim.setIletisim(rs.getString("iletisim"));
                ogretim.setSifre(rs.getString("sifre"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return ogretim;

    }

    /**
     * Öğrenci danışmanları hakkında bilgi veren metot. Argümanlara göre
     * veritabanına yapılan sorgu sonuçları kullanılarak
     * {@link OgretimUyesi} tipinde bir nesne oluşturulur. Bu nesnede parametre
     * olarak verilen öğrenciye atanmış olan danışman hakkında bilgiler bulunur.
     *
     * @param ogrenci Danışmanı hakkında bilgi sunulacak öğrenci
     *
     * @return Veritabanından çekilen bilgilerle oluşturulan {@link OgretimUyesi}
     * tipinde nesne döndürülür. Eğer hata oluşursa {@code null} döndürülür.
     */
    public OgretimUyesi ogrenciDanismanVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        OgretimUyesi danisman = null;

        String danismanSorgu = "select * from ogretimuyesi "
                + "where idogretimuyesi=" + ogrenci.getDanisman().getId();

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(danismanSorgu);
            while (rs.next()) {
                danisman = new OgretimUyesi();
                AnabilimDali anabilimDali = new AnabilimDali();
                Enstitu enstitu = new Enstitu();

                danisman.setId(rs.getInt("idogretimuyesi"));
                danisman.setAd(rs.getString("adi"));
                danisman.setSoyad(rs.getString("soyadi"));
                danisman.setTckimlik(rs.getString("kimlikno"));
                danisman.setUnvan(unvanVer(rs.getInt("unvanid")));
                danisman.setSicilNo(rs.getString("sicilno"));
                danisman.setAnabilimDali(anabilimDaliVer(rs.getInt("anabilimid")));
                danisman.setIletisim(rs.getString("iletisim"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return danisman;
    }

    /**
     * Girilen sayı değerine karşılık gelen unvan bilgilerini döndüren metot.
     * Amacı sorgular için kısayol oluşturmak.
     *
     * @param unvanid Hakkında bilgi çekilecek olan unvanın id'si
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan unvan
     * nesnesi. Nesnenin tipi {@link Unvan} şeklindedir.
     */
    public Unvan unvanVer(int unvanid) {
        Statement sorgu = null;
        Unvan unvan = null;

        String unvanSorgu = "select * from unvan where idunvan=" + unvanid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(unvanSorgu);
            while (rs.next()) {
                unvan = new Unvan();
                unvan.setId(rs.getInt("idunvan"));
                unvan.setUnvanAdi(rs.getString("unvanadi"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return unvan;
    }

    /**
     * Girilen sayı değerine karşılık gelen ders bilgilerini döndüren metot.
     * Amacı sorgular için kısayol oluşturmak.
     *
     * @param dersid Hakkında bilgi çekilecek olan dersin id'si
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan ders
     * nesnesi. Nesnenin tipi {@link Ders} şeklindedir.
     */
    public Ders dersVer(int dersid) {
        Statement sorgu = null;
        Ders ders = null;

        String dersSorgu = "select * from ders where idders=" + dersid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(dersSorgu);
            while (rs.next()) {
                ders = new Ders();
                ders.setDersTipi(rs.getInt("derstipi"));
                ders.setId(rs.getInt("idders"));
                ders.setDersKodu(rs.getInt("derskodu"));
                ders.setDersAdi(rs.getString("dersadi"));
                ders.setDersKredi(rs.getInt("derskredi"));
                ders.setDonem(donemVer(rs.getInt("donemid")));
                ders.setAnabilimDali(anabilimDaliVer(rs.getInt("anabilimid")));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return ders;
    }

    /**
     * Girilen sayı değerine karşılık gelen enstitüyü döndüren metot. Verilen id
     * ile enstitüye ait tüm bilgiler çekilir
     *
     * @param enstituid Bilgileri çekilecek enstitünün id
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan
     * enstitü bilgilerini içeren {@link Enstitu} nesnesi.
     */
    public Enstitu enstituVer(int enstituid) {
        Statement sorgu = null;
        Enstitu enstitu = null;

        String enstituSorgu = "select * from enstitu where idenstitu=" + enstituid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(enstituSorgu);
            while (rs.next()) {
                enstitu = new Enstitu();
                enstitu.setId(rs.getInt("idenstitu"));
                enstitu.setEnstituAdi(rs.getString("enstituadi"));
                enstitu.setEnstituBaskan(rs.getString("enstitubaskani"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return enstitu;
    }

    /**
     * Girilen sayı değerine karşılık gelen anabilim dalını döndüren metot.
     *
     * @param anabilimid Bilgileri çekilecek anabilim dalının id'si
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan
     * anabilim dalı nesnesi. Nesne tipi {@link AnabilimDali} şeklindedir.
     */
    public AnabilimDali anabilimDaliVer(int anabilimid) {
        Statement sorgu = null;
        AnabilimDali anabilim = null;

        String anabilimSorgu = "select * from anabilimdali where idanabilimdali=" + anabilimid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(anabilimSorgu);
            while (rs.next()) {
                anabilim = new AnabilimDali();
                anabilim.setId(rs.getInt("idanabilimdali"));
                anabilim.setAnabilimAdi(rs.getString("enstituadi"));
                anabilim.setAnabilimBaskan(rs.getString("enstitubaskani"));
                anabilim.setEnstitu(enstituVer(rs.getInt("enstituid")));
                anabilim.setIletisim(rs.getString("iletisim"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return anabilim;
    }

    /**
     * Girilen sayı değerine karşılık gelen öğretim üyesi döndüren metot.
     *
     * @param ogretimuyeid Bilgileri çekilecek olan öğretim üyesinin id'si
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan
     * öğretim üyesi nesnesi. Dönen nesne tipi {@link OgretimUyesi} şeklindedir.
     */
    public OgretimUyesi ogretimUyesiVer(int ogretimuyeid) {
        Statement sorgu = null;
        OgretimUyesi ogretimUyesi = null;

        String ogretimUyesiSorgu = "select * from ogretimuyesi where idogretimuyesi=" + ogretimuyeid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(ogretimUyesiSorgu);
            while (rs.next()) {
                ogretimUyesi = new OgretimUyesi();
                ogretimUyesi.setId(rs.getInt("idogretimuyesi"));
                ogretimUyesi.setAd(rs.getString("adi"));
                ogretimUyesi.setSoyad(rs.getString("soyadi"));
                ogretimUyesi.setTckimlik(rs.getString("kimlikno"));
                ogretimUyesi.setUnvan(unvanVer(rs.getInt("unvanid")));
                ogretimUyesi.setSicilNo(rs.getString("sicilno"));
                ogretimUyesi.setAnabilimDali(anabilimDaliVer(rs.getInt("anabilimid")));
                ogretimUyesi.setIletisim(rs.getString("iletisim"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return ogretimUyesi;
    }

    /**
     * Girilen sayı değerine karşılık gelen ogrenci döndüren metot.
     *
     * @param ogrenciid Bilgileri çekilecek olan öğrencinin id'si
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan
     * öğrenci nesnesi. Dönen nesne tipi {@link Ogrenci} şeklindedir.
     */
    public Ogrenci ogrenciVer(int ogrenciid) {
        Statement sorgu = null;
        Ogrenci ogrenci = null;

        String ogrenciSorgu = "select * from ogrenci where idogrenci=" + ogrenciid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(ogrenciSorgu);
            while (rs.next()) {
                ogrenci = new Ogrenci();
                ogrenci.setId(rs.getInt("idogrenci"));
                ogrenci.setAd(rs.getString("adi"));
                ogrenci.setSoyad(rs.getString("soyadi"));
                ogrenci.setOgrenciNo(rs.getString("ogrencino"));
                ogrenci.setTckimlik(rs.getString("kimlikno"));
                ogrenci.setDanisman(ogretimUyesiVer(rs.getInt("danismanid")));
                ogrenci.setAnabilimDali(anabilimDaliVer(rs.getInt("anabilimid")));
                ogrenci.setKayitYili(rs.getInt("kayityili"));
                ogrenci.setIletisim(rs.getString("iletisim"));
                ogrenci.setEnstitu(enstituVer(ogrenci.getAnabilimDali().getEnstitu().getId()));
                ogrenci.setSifre(rs.getString("sifre"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return ogrenci;
    }

    /**
     * Girilen sayı değerine karşılık gelen dönem bilgilerini döndüren metot.
     *
     * @param donemid Bilgileri çekilecek olan donemin id'si
     *
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan dönem
     * nesnesi. Dönen nesne tipi {@link Dönem} şeklindedir.
     */
    public Donem donemVer(int donemid) {
        Statement sorgu = null;
        Donem donem = null;

        String donemSorgu = "select * from donem where iddonem=" + donemid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(donemSorgu);
            while (rs.next()) {
                donem = new Donem();
                donem.setId(rs.getInt("iddonem"));
                donem.setYil(rs.getInt("donemyili"));
                donem.setDonemNo(rs.getInt("donemno"));
                donem.setAciklama(rs.getString("aciklama"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return donem;
    }

    /**
     * Ogrenci kullanıcısının şifresini değiştirmek amacıyla kullanılan metot.
     *
     * @param ogrenci Şifresi değiştirilecek öğrenci kullanıcına ait nesne
     *
     */
    public void ogrenciSifreDegistir(Ogrenci ogrenci) {
        Statement sorgu = null;

        String sifreSorgu = "update ogrenci set sifre='" + ogrenci.getSifre() + "'"
                + " where idogrenci=" + ogrenci.getId();

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            sorgu.executeUpdate(sifreSorgu);
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
    }

    /**
     * Ogretim üyesi kullanıcısının şifresini değiştirmek amacıyla kullanılan
     * metot.
     *
     * @param ogretimUyesi
     *
     */
    public void ogretimSifreDegistir(OgretimUyesi ogretimUyesi) {
        Statement sorgu = null;

        String sifreSorgu = "update ogretimuyesi set sifre='" + ogretimUyesi.getSifre() + "'"
                + " where idogretimuyesi=" + ogretimUyesi.getId();

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            sorgu.executeUpdate(sifreSorgu);
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
    }

    /**
     * Öğrencilerin not bilgilerini çeken metot. Döndürülen bilgiler iç içe {@link ArrayList}
     * tipindedir. Bu bir nevi matris düzenindedir. Bu şekilde kullanımın sebebi
     * dönemlere göre ayırmayı bir nebze kolaylaştırmaktır.
     *
     * Bilgiler çekilirken dersin öğrenci tarafından alınması, yani
     * onaydurumunun 1 olması gerekmektedir.
     *
     * @param ogrenci Notları çekilecek öğrencinin bilgilerini barındıran
     * {@link Ogrenci} tipinde nesnedir.
     *
     * @return  {@link ArrayList} tipinde bir matris. Matrisin her satırı {@link DersOgrenci}
     * tipindedir.
     */
    public ArrayList<ArrayList<DersOgrenci>> ogrenciNotlari(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<ArrayList<DersOgrenci>> notlar = new ArrayList<ArrayList<DersOgrenci>>();

        String notSorgu = "select * from dersogrenci where ogrenciid=" + ogrenci.getId()
                + " and onaydurumu=1";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(notSorgu);

            ArrayList<DersOgrenci> tum = new ArrayList<DersOgrenci>();

            while (rs.next()) {
                DersOgrenci not = new DersOgrenci();
                not.setOgrenci(ogrenciVer(rs.getInt("ogrenciid")));
                not.setDers(dersVer(rs.getInt("dersid")));
                not.setDersNotu(rs.getInt("dersnotu"));
                not.setDonem(donemVer(rs.getInt("donemid")));
                not.setOnayDurumu(rs.getInt("onaydurumu"));
                not.setBasariDurumu(rs.getInt("basaridurumu"));
                tum.add(not);
            }

            DersOgrenci ara = null;
            Stack<DersOgrenci> gecici = new Stack<DersOgrenci>();

            // 4
            for (int j = 0; j < tum.size(); j++) {
                ara = tum.get(j);
                // ilk başta nolursa olsun at
                if (j == 0) {
                    gecici.add(ara);
                } else if (gecici.lastElement().getDonem().getId() == ara.getDonem().getId()) {
                    gecici.add(ara);
                } else {
                    ArrayList<DersOgrenci> araBolge = new ArrayList<DersOgrenci>();
                    araBolge.addAll(gecici);
                    notlar.add(araBolge);
                    gecici.clear();
                    // yeni donemi ekle
                    gecici.add(ara);
                }
            }
            ArrayList<DersOgrenci> temp = new ArrayList<DersOgrenci>();
            temp.addAll(gecici);
            notlar.add(temp);

        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return notlar;
    }

    /**
     * Öğrencinin belli bir dönemde aldığı derslerin listesini veren metot.
     * Öğrencilerin bir dönemde aldığı dersler {@link ArrayList} tipinde bir
     * veri yapısıyla döndürülür. Bu veri yapısındaki her eleman {@link DersOgrenci}
     * tipindedir.
     *
     * @param ogrenci Aldığı dersleri görmek istenen öğrencinin bilgilerini
     * tutan {@link Ogrenci} tipinde nesne.
     * @param donem Öğrencinin önceki dönemlerde aldığı dersler hakkında da
     * bilgi alabilmek için kullanılan {@link Donem} tipinde nesne.
     *
     * @return Öğrencinin belli dönemde aldığı dersler hakkında ayrıntılı bilgi
     * sunan bir liste nesnesi. Tipi {@link ArrayList} şeklindedir. Her bir
     * eleman ise {@link DersOgrenci} tipindedir.
     *
     */
    public ArrayList<DersOgrenci> ogrenciAlinanDerslerVer(Ogrenci ogrenci, Donem donem) {
        Statement sorgu = null;
        ArrayList<DersOgrenci> alinanDersler = new ArrayList<DersOgrenci>();

        String derslerSorgu = "select * from dersogrenci where "
                + "ogrenciid=" + ogrenci.getId() + " and donemid=" + donem.getId()
                + " and onaydurumu=1";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(derslerSorgu);
            while (rs.next()) {
                DersOgrenci ara = new DersOgrenci();
                ara.setOgrenci(ogrenci);
                ara.setDers(dersVer(rs.getInt("dersid")));
                ara.setDersNotu(rs.getInt("dersnotu"));
                ara.setDonem(donem);
                ara.setOnayDurumu(rs.getInt("onaydurumu"));
                ara.setBasariDurumu(rs.getInt("basaridurumu"));
                alinanDersler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return alinanDersler;
    }

    /**
     * Sistemin o an üzerinde bulunduğu son dönemi verir. Bu bilgiyi, önce donem
     * tablosundan en büyük ID'yi alarak yapar. Sonra bu ID'yi {@code donemVer(Donem)}
     * metoduna gönderir ve gerekli dönem bilgilerini alır.
     *
     * @return Dönen nesne tipi {@link Dönem} şeklindedir. Sistemin üzerinde
     * bulunduğu son dönemin bilgilerini verir.
     */
    public Donem sonDonemVer() {
        Statement sorgu = null;
        Donem donem = null;

        String idDonemSorgu = "select max(iddonem) son from donem";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(idDonemSorgu);
            while (rs.next()) {
                donem = donemVer(rs.getInt("son"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return donem;
    }

    /**
     * Öğrencinin son yani üzerinden bulunulan dönemde aldığı derslerin
     * listesini veren metot. Öğrencilerin bir dönemde aldığı dersler {@link ArrayList}
     * tipinde bir veri yapısıyla döndürülür. Bu veri yapısındaki her eleman {@link DersOgrenci}
     * tipindedir.
     *
     * @param ogrenci Son dönemde aldığı dersleri görmek istenen öğrencinin
     * bilgilerini tutan {@link Ogrenci} tipinde nesne.
     *
     * @return Öğrencinin son dönemde aldığı dersler hakkında ayrıntılı bilgi
     * sunan bir liste nesnesi. Tipi {@link ArrayList} şeklindedir. Her bir
     * eleman ise {@link DersOgrenci} tipindedir.
     *
     */
    public ArrayList<DersOgrenci> ogrenciSonAlinanDerslerVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<DersOgrenci> sonAlinanDersler = new ArrayList<DersOgrenci>();
        Donem sonDonem = sonDonemVer();

        String derslerSorgu = "select * from dersogrenci where "
                + "ogrenciid=" + ogrenci.getId() + " and donemid=" + sonDonem.getId()
                + " and onaydurumu=1";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(derslerSorgu);
            while (rs.next()) {
                DersOgrenci ara = new DersOgrenci();
                ara.setOgrenci(ogrenci);
                ara.setDers(dersVer(rs.getInt("dersid")));
                ara.setDersNotu(rs.getInt("dersnotu"));
                ara.setDonem(sonDonem);
                ara.setOnayDurumu(rs.getInt("onaydurumu"));
                ara.setBasariDurumu(rs.getInt("basaridurumu"));
                sonAlinanDersler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return sonAlinanDersler;
    }

    /**
     * Öğrencinin son dönemde aldığı ödevleri verir.
     *
     * @param ogrenci ödevleri çekilecek öğrenci
     *
     * @return Öğrencinin son dönemde aldığı ödevleri {@link ArrayList} tipinde
     * veri yapısıyla döndürür.
     */
    public ArrayList<OdevNot> ogrenciOdevleriVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<OdevNot> sonDonemOdevler = new ArrayList<OdevNot>();
        Donem sonDonem = sonDonemVer();

        String sonOdevlerSorgu = "select odevnot.* from odevnot, dersogrenci "
                + "where odevnot.gonderitipi = 1 and "
                + "dersogrenci.ogrenciid = " + ogrenci.getId() + " and "
                + "dersogrenci.donemid = " + sonDonemVer().getId() + " and "
                + "dersogrenci.dersid = odevnot.dersid";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(sonOdevlerSorgu);
            while (rs.next()) {
                OdevNot ara = new OdevNot();
                ara = odevVer(rs.getInt("idodevnot"));
                ara.setYanitlanma(ogrenciOdevYanitladiMi(ogrenci, ara));
                sonDonemOdevler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return sonDonemOdevler;

    }

    /**
     * Öğrencinin son dönemde yapmadığı ödevleri verir.
     *
     * @param ogrenci yapmadığı ödevleri çekilecek öğrenci
     *
     * @return Öğrencinin son dönemde yanıtmadığı ödevleri döndürür.
     */
    public ArrayList<OdevNot> ogrenciYanitlanmayanOdevleriVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<OdevNot> sonDonemYanitsizOdevler = new ArrayList<OdevNot>();
        Donem sonDonem = sonDonemVer();

        String sonOdevlerSorgu = "select odevnot.* from odevnot, dersogrenci "
                + "where odevnot.gonderitipi = 1 and "
                + "dersogrenci.ogrenciid = " + ogrenci.getId() + " and "
                + "dersogrenci.donemid = " + sonDonemVer().getId() + " and "
                + "dersogrenci.dersid = odevnot.dersid";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(sonOdevlerSorgu);
            while (rs.next()) {
                OdevNot ara = new OdevNot();
                ara = odevVer(rs.getInt("idodevnot"));
                boolean durum = ogrenciOdevYanitladiMi(ogrenci, ara);
                if (!durum) {
                    sonDonemYanitsizOdevler.add(ara);
                }
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return sonDonemYanitsizOdevler;
    }

    /**
     * Öğrencinin son dönemde yapmadığı ödevlerinin sayısını verir.
     *
     * @param ogrenci yapmadığı ödevlerin sayısı çekilecek öğrenci
     *
     * @return Öğrencinin son dönemde yanıtmadığı ödevlerin sayısını döndürür.
     */
    public int ogrenciYanitlanmayanOdevSayisiVer(Ogrenci ogrenci) {
        return ogrenciYanitlanmayanOdevleriVer(ogrenci).size();
    }

    /**
     * Girilen sayı değerine karşılık gelen ödevi döndüren metot.
     *
     * @param odevid Bilgileri çekilecek olan ödev id'si
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan ödev
     * nesnesi. Dönen nesne tipi {@link OdevNot} şeklindedir.
     */
    public OdevNot odevVer(int odevid) {
        Statement sorgu = null;
        OdevNot odev = null;

        String odevSorgu = "select * from odevnot where gonderitipi=1 and "
                + "idodevnot=" + odevid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(odevSorgu);
            while (rs.next()) {
                odev = new OdevNot();
                odev.setId(rs.getInt("idodevnot"));
                odev.setDers(dersVer(rs.getInt("dersid")));
                odev.setGonderen(ogretimUyesiVer(rs.getInt("gonderenid")));
                odev.setBaslik(rs.getString("odevadi"));
                odev.setTip(rs.getInt("gonderitipi"));
                odev.setDosyaYolu(rs.getString("dosyayolu"));
                odev.setAciklama(rs.getString("aciklama"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
        return odev;
    }

    /**
     * Girilen id'ye karşılık gelen dönemin son dönem olup olmadığını kontrol
     * eden metot.
     *
     * @param donemid son dönem olup olmadığı kontrol edilecek dönem id'si
     *
     * @return eğer girilen dönem id'si son dönemi gösteriyorsa {@code true}
     * yoksa {@code false} döndürülür.
     */
    public boolean sonDonemMi(int donemid) {
        Donem sonDonem = sonDonemVer();
        if (donemid == sonDonem.getId()) {
            return true;
        }
        return false;
    }

    /**
     * Öğrencinin parametre olarak verilen dersi son dönem içerisinde alıp
     * almadığını gösteren metot.
     *
     * @param ogrenci Dersleri üzerinde arama yapılacak öğrenci. Tipi
     * {@link Ogrenci} tipindedir.
     * @param ders Öğrencinin son dönem içerisinde alıp almadığı kontrol
     * edilecek olan {@link Ders} tipindeki nesne.
     *
     * @return Eğer parametre olarak verilen {@code ders} öğrenci tarafından son
     * dönem içerisinde alınıyorsa {@code true} döndürülür. Aksi halde
     * {@code false} döndürülür.
     */
    public boolean ogrenciDersiAliyorMu(Ogrenci ogrenci, Ders ders) {
        ArrayList<DersOgrenci> sonDersler = ogrenciSonAlinanDerslerVer(ogrenci);
        for (DersOgrenci d : sonDersler) {
            if (d.getDers().getId() == ders.getId()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Öğrencinin parametre olarak verilen ödeve daha önce yanıt verip
     * vermediğini bildiren metot.
     *
     * Ek herhangi bir bilgi vermez. Sadece o ödevin yanıtlanıp
     * yanıtlanmadığıyla ilgilenir.
     *
     * @param ogrenci Ödev kontrolü yapılacak {@link Ogrenci} tipindeki öğrenci
     * nesnesi
     *
     * @param odev Öğrencinin yanıtlayıp yanıtlamadığının sorgulanacağı ödev {@link OdevNot}
     * tipindedir.
     *
     * @return Eğer öğrenci parametre olarak verilen ödevi yanıtlamış ise
     * {@code true}, aksi halde {@code false} döndürülür.
     *
     */
    public boolean ogrenciOdevYanitladiMi(Ogrenci ogrenci, OdevNot odev) {

        Statement sorgu = null;
        int miktar = 0;

        String odevSorgu = "select count(idodevogrenci) miktar from odevogrenci, odevnot where "
                + "odevogrenci.odevid = odevnot.idodevnot and "
                + "odevogrenci.gonderenid = " + ogrenci.getId() + " and "
                + "odevnot.idodevnot = " + odev.getId();

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(odevSorgu);
            while (rs.next()) {
                miktar = rs.getInt("miktar");
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return (miktar > 0) ? true : false;
    }

    /**
     * Öğrencinin yüklediği ödevi veritabanına yazan metot.
     *
     * @param odev Sisteme kaydedilecek ödev yanıtını barındıran metot.
     * {@link OdevOgrenci} tipinde bir nesnedir.
     *
     */
    public void ogrenciOdevGonder(OdevOgrenci odev) {
        Statement sorgu = null;
        String odevKaydetmeSorgu = "insert into odevogrenci "
                + "(odevid, gonderenid, odevadi, dosyayolu, aciklama) "
                + "values (" + odev.getOdev().getId() + "," + odev.getGonderen().getId() + ", "
                + "'" + odev.getBaslik() + "', '" + odev.getDosyaYolu() + "', "
                + "'" + odev.getAciklama() + "');";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            sorgu.executeUpdate(odevKaydetmeSorgu);
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
    }

    /**
     * Girilen bilgilere göre öğrencinin yüklediği ödevi döndüren metot.
     *
     * @param ogrenci Ödevi yükleyen öğrenci
     * @param odevid Bilgileri çekilecek olan ödev id'si
     *
     * @return Veritabanından, öğrenci ve odev id bilgilerine karşılık gelen
     * {@link OdevOgrenci} tipinde nesne döndürülür.
     *
     */
    public OdevOgrenci ogrenciYuklenenOdeviVer(Ogrenci ogrenci, int odevid) {
        Statement sorgu = null;
        OdevOgrenci odev = new OdevOgrenci();

        String odevSorgu = "select * from odevogrenci where "
                + "gonderenid=" + ogrenci.getId() + " and "
                + "odevid=" + odevid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(odevSorgu);
            while (rs.next()) {
                odev = new OdevOgrenci();
                odev.setId(rs.getInt("idodevogrenci"));
                odev.setOdev(odevVer(odevid));
                odev.setGonderen(ogrenci);
                odev.setBaslik(rs.getString("odevadi"));
                odev.setDosyaYolu(rs.getString("dosyayolu"));
                odev.setAciklama(rs.getString("aciklama"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
        return odev;
    }

    /**
     * Girilen sayı değerine karşılık gelen çalışma notunu döndüren metot.
     *
     * @param notid Bilgileri çekilecek olan notun id'si
     *
     * @return Veritabanından döndürülecek ve id'ye karşılık gelecek olan
     * çalışma notu nesnesi. Dönen nesne tipi {@link OdevNot} şeklindedir.
     */
    public OdevNot calismaNotuVer(int notid) {
        Statement sorgu = null;
        OdevNot calismaNotu = null;

        String odevSorgu = "select * from odevnot where gonderitipi=2 and "
                + "idodevnot=" + notid;

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(odevSorgu);
            while (rs.next()) {
                calismaNotu = new OdevNot();
                calismaNotu.setId(rs.getInt("idodevnot"));
                calismaNotu.setDers(dersVer(rs.getInt("dersid")));
                calismaNotu.setGonderen(ogretimUyesiVer(rs.getInt("gonderenid")));
                calismaNotu.setBaslik(rs.getString("odevadi"));
                calismaNotu.setTip(rs.getInt("gonderitipi"));
                calismaNotu.setDosyaYolu(rs.getString("dosyayolu"));
                calismaNotu.setAciklama(rs.getString("aciklama"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
        return calismaNotu;
    }

    /**
     * Öğrencinin son dönemde aldığı derslere ait çalışma notlarını verir.
     *
     * @param ogrenci kendisini ilgilendiren çalışma notları çekilecek öğrenci
     *
     * @return Öğrencinin son dönemde aldığı derslere ait çalışma notları
     * {@link ArrayList} tipinde veri yapısıyla döndürür.
     *
     */
    public ArrayList<OdevNot> ogrenciCalismaNotlariVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<OdevNot> sonDonemCalismaNotlari = new ArrayList<OdevNot>();
        Donem sonDonem = sonDonemVer();

        String sonNotlarSorgu = "select odevnot.* from odevnot, dersogrenci "
                + "where odevnot.gonderitipi = 2 and "
                + "dersogrenci.ogrenciid = " + ogrenci.getId() + " and "
                + "dersogrenci.donemid = " + sonDonemVer().getId() + " and "
                + "dersogrenci.dersid = odevnot.dersid";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(sonNotlarSorgu);
            while (rs.next()) {
                OdevNot ara = new OdevNot();
                ara = calismaNotuVer(rs.getInt("idodevnot"));
                sonDonemCalismaNotlari.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
        System.out.println("not: " + sonDonemCalismaNotlari);
        return sonDonemCalismaNotlari;

    }

    /**
     * Ders kaydının açık olup olmadığı konusunda bilgi veren metot.
     *
     * @return Eğer ders kaydı açıksa {@code true}; aksi durumda {@code false}
     * döndürülür.
     *
     */
    public boolean dersKayitAcikMi() {
        Statement sorgu = null;
        boolean sonuc = false;

        String dersKayitSorgu = "select * from ayarlar where anahtar='derskayit'";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(dersKayitSorgu);
            while (rs.next()) {
                if (rs.getInt("deger") == 1) {
                    sonuc = true;
                } else {
                    sonuc = false;
                }

            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
        return sonuc;
    }

    /**
     * Öğrencinin son yani üzerinden bulunulan dönemde beklemede olan derslerin
     * listesini veren metot. Beklemede olan dersler {@link ArrayList} tipinde
     * bir veri yapısında tutulur.
     *
     * @param ogrenci Son dönemdeki beklemede olan dersleri görülmek istenen
     * öğrencinin bilgilerini tutan {@link Ogrenci} tipinde nesne.
     *
     * @return Öğrencinin son dönemdeki beklemede olan dersleri hakkında
     * ayrıntılı bilgi sunan bir liste nesnesi. Tipi {@link ArrayList}
     * şeklindedir. Her bir eleman ise {@link DersOgrenci} tipindedir.
     *
     */
    public ArrayList<DersOgrenci> ogrenciSonBeklemedeDerslerVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<DersOgrenci> sonBeklemededeDersler = new ArrayList<DersOgrenci>();
        Donem sonDonem = sonDonemVer();

        String beklemedeSorgu = "select * from dersogrenci where "
                + "ogrenciid=" + ogrenci.getId() + " and donemid=" + sonDonem.getId()
                + " and onaydurumu=2";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(beklemedeSorgu);
            while (rs.next()) {
                DersOgrenci ara = new DersOgrenci();
                ara.setOgrenci(ogrenci);
                ara.setDers(dersVer(rs.getInt("dersid")));
                ara.setDersNotu(rs.getInt("dersnotu"));
                ara.setDonem(sonDonem);
                ara.setOnayDurumu(rs.getInt("onaydurumu"));
                ara.setBasariDurumu(rs.getInt("basaridurumu"));
                sonBeklemededeDersler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return sonBeklemededeDersler;
    }

    /**
     * Öğrencinin son dönemde beklemede olan ders sayısını veren metot.
     *
     * @param ogrenci Son dönemdeki beklemede olan derslerin sayısı görülmek
     * istenen öğrencinin bilgilerini tutan {@link Ogrenci} tipinde nesne.
     *
     * @return Son dönemde beklemede olan ders sayısını veren metot.
     */
    public int ogrenciBeklemedeDersSayisiVer(Ogrenci ogrenci) {
        return ogrenciSonBeklemedeDerslerVer(ogrenci).size();
    }

    /**
     * Öğrencinin sistem içerisinde bulunduğu dönemi veren metot.
     *
     * Sistemin içerisinde bulunduğu dönem ile öğrencinin içerisinde bulunduğu
     * dönem farklıdır. Öğrenci, ders kaydını tamamladığında içerisinde
     * bulunduğu dönem sistemin son dönemine güncellenir. Bu durum ders kaydı
     * esnasında kontrol için kullanılacaktır.
     *
     * @param ogrenci İçerisinde bulunduğu son dönemi çekilecek öğrenci nesnesi
     *
     * @return Öğrencinin içerisinde bulunduğu dönem döndürülür. Dönen bu nesne
     * {@link Donem} tipindedir.
     *
     */
    public Donem ogrenciBulunduguSonDonemVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        Donem donem = null;

        String donemSorgu = "select max(donemid) sonDonem from dersogrenci "
                + "where ogrenciid=" + ogrenci.getId() + " and onaydurumu=1";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(donemSorgu);
            while (rs.next()) {
                donem = donemVer(rs.getInt("sonDonem"));
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return donem;
    }

    /**
     * Öğrencinin sistem içerisindeki döneminin son döneme eşit olup olmadığını
     * kontrol eden metot.
     *
     * Bu metot ders kaydının yapılıp yapılmadığı konusunda fikir verir.
     *
     * @param ogrenci Son dönemde olup olmadığı kontrol edilecek öğrenci nesnesi
     *
     * @return Eğer öğrencinin içerisinde bulunduğu dönem sistemin dönemine
     * eşitse
     * {@code true}; aksi halde {@code false} döndürülür.
     *
     */
    public boolean ogrenciSonDonemdeMi(Ogrenci ogrenci) {
        System.out.println("sondonemver: " + sonDonemVer());
        System.out.println("ogrencbul: " + ogrenciBulunduguSonDonemVer(ogrenci));
        if (sonDonemVer().getId() == ogrenciBulunduguSonDonemVer(ogrenci).getId()) {
            return true;
        }
        return false;
    }

    /**
     * Öğrencinin ders kaydı yapacağı döneme(güz/bahar) ait olan ve kaldığı
     * dersleri verir.
     *
     * Ders kaydı yapılırken önceki dönemde kalınmış olan dersler de
     * listelenmelidir.
     *
     * @param ogrenci Son dönemin güz/baharına göre kaldığı dersleri verilecek
     * olan öğrenci nesnesi
     *
     * @return Son dönemde kaldığı dersleri içeren liste. {@link ArrayList}
     * tipindedir.
     *
     */
    public ArrayList<Ders> ogrenciKaldigiDerslerVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<Ders> kalinanDersler = new ArrayList<Ders>();
        Donem sonDonem = sonDonemVer();

        String kalinanDerslerSorgu = "select dersid from dersogrenci where "
                + "ogrenciid=" + ogrenci.getId() + " and basaridurumu=0 and donemid in "
                + "(select distinct donemid from ders where donemid in "
                + "(select iddonem from donem where donemno=" + sonDonem.getDonemNo() + "))";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(kalinanDerslerSorgu);
            while (rs.next()) {
                Ders ara = new Ders();;
                ara = dersVer(rs.getInt("dersid"));
                kalinanDersler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return kalinanDersler;
    }

    /**
     * Öğrencinin ders kaydı için alınabilecek dersleri veren metot.
     *
     * Öğrencinin ders kaydı yapıldığı dönemde bulunan dersler ve yine aynı
     * dönemin geçmişte hiç alınmayan dersler listelenir. Burada dönemden kasıt
     * güz/bahar şeklindedir. Yani yıl bilgisi kullanılmaz.
     *
     * @param ogrenci Ders kaydı için alabileceği dersleri listelenen öğrenci
     * nesnesi
     *
     * @return Ders kaydı aşamasında kullanılacak olan ve bu dönem tipinde
     * alınabilecek dersler ve daha önceden alınmamış derslerin bulunduğu liste
     * döndürülür. Bu liste {@link ArrayList} tipindedir.
     *
     */
    public ArrayList<Ders> ogrenciAlinabilecekDersler(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<Ders> alinabilecekDersler = new ArrayList<Ders>();
        Donem sonDonem = sonDonemVer();

        String alinabilecekDerslerSorgu = "select idders from ders where "
                + "idders not in(select dersid from dersogrenci where "
                + "ogrenciid=" + ogrenci.getId() + " and donemid in "
                + "(select distinct donemid from ders where donemid in "
                + "(select iddonem from donem where donemno=" + sonDonem.getDonemNo() + "))) and "
                + "donemid in (select distinct donemid from ders where donemid "
                + "in (select iddonem from donem where donemno=" + sonDonem.getDonemNo() + "))";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(alinabilecekDerslerSorgu);
            while (rs.next()) {
                Ders ara = new Ders();
                ara = dersVer(rs.getInt("idders"));
                alinabilecekDersler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return alinabilecekDersler;
    }

    /**
     * Öğrencinin son yani üzerinden bulunulan dönemde onaylanmış olan derslerin
     * listesini veren metot. Onaylanan dersler {@link ArrayList} tipinde bir
     * veri yapısında tutulur.
     *
     * @param ogrenci Son dönemdeki onaylanan dersleri görülmek istenen
     * öğrencinin bilgilerini tutan {@link Ogrenci} tipinde nesne.
     *
     * @return Öğrencinin son dönemdeki onaylanan dersleri hakkında ayrıntılı
     * bilgi sunan bir liste nesnesi. Tipi {@link ArrayList} şeklindedir. Her
     * bir eleman ise {@link DersOgrenci} tipindedir.
     *
     */
    public ArrayList<DersOgrenci> ogrenciSonOnaylananDerslerVer(Ogrenci ogrenci) {
        Statement sorgu = null;
        ArrayList<DersOgrenci> sonOnaylananDersler = new ArrayList<DersOgrenci>();
        Donem sonDonem = sonDonemVer();

        String beklemedeSorgu = "select * from dersogrenci where "
                + "ogrenciid=" + ogrenci.getId() + " and donemid=" + sonDonem.getId()
                + " and onaydurumu=1";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(beklemedeSorgu);
            while (rs.next()) {
                DersOgrenci ara = new DersOgrenci();
                ara.setOgrenci(ogrenci);
                ara.setDers(dersVer(rs.getInt("dersid")));
                ara.setDersNotu(rs.getInt("dersnotu"));
                ara.setDonem(sonDonem);
                ara.setOnayDurumu(rs.getInt("onaydurumu"));
                ara.setBasariDurumu(rs.getInt("basaridurumu"));
                sonOnaylananDersler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return sonOnaylananDersler;
    }

    /**
     * Öğrenciye ders atamak için kullanılacak metot.
     *
     * Ders kaydı aşamasında öğrenci ders kaydını yapıp ders id'lerini
     * gönderdiğinde bu metotla dersogrenci tablosuna yazılır. Ders ataması onay
     * durumunu 2 olarak kaydeder yani beklemede.
     *
     * @param ogrenci Ders kaydı için kendisine ders atanacak öğrenci.
     * @param ders Ders kaydında atanacak ders.
     *
     */
    public void ogrenciDersAta(Ogrenci ogrenci, Ders ders) {
        Statement sorgu = null;
        Donem sonDonem = sonDonemVer();

        String dersKayitSorgu = "insert into dersogrenci "
                + "(ogrenciid, dersid, dersnotu, donemid, onaydurumu, basaridurumu) "
                + "values (" + ogrenci.getId() + ", " + ders.getId() + ", -1, " + sonDonem.getId() + ", "
                + "2, 2);";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            sorgu.executeUpdate(dersKayitSorgu);
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
    }
    
    /**
     * Öğretim üyesinin son dönemde verdiği dersleri listeyen metot.
     *
     * @param   ogretim     son dönemde verdiği dersleri görüntülenecek olan
     * öğretim üyesi nesnesi
     * 
     * @return  Öğretim üyesinin son dönemde verdiği dersleri içeren liste
     * döndürülür. Liste {@link ArrayList} tipindedir.
     *
     */
    public ArrayList<Ders> ogretimSonVerilenDerslerVer(OgretimUyesi ogretim) {
        Statement sorgu = null;
        ArrayList<Ders> sonVerilenDersler = new ArrayList<Ders>();
        Donem sonDonem = sonDonemVer();

        String derslerSorgu = "select * from ders where "
                + "idders in  (select dersid from dersogretimuyesi where "
                + "ogretimuyesiid=" + ogretim.getId() + " and donemid=" + sonDonem.getId() + ")";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(derslerSorgu);
            while (rs.next()) {
                Ders ara = new Ders();
                ara = dersVer(rs.getInt("idders"));
                sonVerilenDersler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return sonVerilenDersler;
    }
    
    /**
     * Verilen dersi son dönemde alan öğrencilerin listesini döndürür.
     * 
     * Verilen {@link Ders} tipindeki dersi son dönemde alan öğrencileri verir.
     * 
     * @param   ders    Kendisini alan öğrencileri döndürülecek ders nesnesi.
     * 
     * @return  {@link DersOgrenci} tipinde nesneleri barındıran liste.
     * 
     */
    public ArrayList<DersOgrenci> dersiAlanOgrencileriVer(Ders ders) {
        // select * from dersogrenci where dersid = ders.getId()
        Statement sorgu = null;
        ArrayList<DersOgrenci> dersiAlanOgrenciler = new ArrayList<DersOgrenci>();
        Donem sonDonem = sonDonemVer();

        String dersiAlanSorgu = "select * from dersogrenci where dersid = " + ders.getId() + " and "
                + "donemid = " + sonDonem.getId();

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(dersiAlanSorgu);
            while (rs.next()) {
                DersOgrenci ara = new DersOgrenci();
                ara.setId(rs.getInt("iddersogrenci"));
                ara.setOgrenci(ogrenciVer(rs.getInt("ogrenciid")));
                ara.setDers(dersVer(rs.getInt("dersid")));
                ara.setDersNotu(rs.getInt("dersnotu"));
                ara.setDonem(donemVer(rs.getInt("donemid")));
                ara.setOnayDurumu(rs.getInt("onaydurumu"));
                ara.setBasariDurumu(rs.getInt("basaridurumu"));
                dersiAlanOgrenciler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return dersiAlanOgrenciler;
    }
    
    /**
     * Öğretim üyesinin derslerini son dönemde alan öğrencilerin notlarını ve
     * geçme durumlarını güncelleyen metot.
     * 
     * Eğer ders tipi bir seminer dersi ise ve geçme durumu 0 ise not olarak 0
     * kaydedilir. Başarı durumu 1 ise yani başarılı ise not olarak 100 eklenir.
     * Notmal derslerde ise not olduğu gibi aktarılır. Geçme durumu olarak 0 başarısız;
     * 1 ise başarılı manasına gelir.
     * 
     * @param   dersNotListesi  Tüm öğrencilere ilişkin bilgi, not, durum bilgilerini
     * tutan {@link DersOgrenci} tipinde nesnelerin bulunduğu liste. Veritabanına
     * kaydedilecek yeni notlar ve geçme durumlarını da barındırır.
     * 
     */
    public void ogretimDersNotlariGuncelle(ArrayList<DersOgrenci> dersNotListesi) {
        Statement sorgu = null;
        String notSorgu = null;

        baglan();
        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        for (DersOgrenci d : dersNotListesi) {
            notSorgu = "update dersogrenci set "
                    + "dersnotu=" + d.getDersNotu() + ", basaridurumu=" + d.getBasariDurumu() + " "
                    + "where ogrenciid=" + d.getOgrenci().getId() + " and dersid=" + d.getDers().getId();

            try {
                sorgu.executeUpdate(notSorgu);
            } catch (SQLException ex) {
                System.out.println("sql hata: " + ex.toString());
            }
       }

       baglantiKes();
    }
    
    /**
     * Öğretim üyesinin son dönemde verdiği derse ait ödevleri listeyen metot.
     * 
     * Tüm işlemler son dönem gözetilerek yapılır.
     * 
     * @param   ogretim     Verdiği ödevler listelenecek olan öğretim üyesi nesnesi
     * @param   ders    Kendisine yüklenmiş olan ödevleri verilecek olan ders nesnesi
     * 
     * @return  Öğretim üyesinin son dönemde verdiği ödevler bir liste içerisinde
     * döndürülür. Bu listedeki her eleman {@link OdevNot} tipindedir
     * 
     */
    public ArrayList<OdevNot> ogretimDersinOdevleriVer(OgretimUyesi ogretim, Ders ders) {
        Statement sorgu = null;
        ArrayList<OdevNot> sonDonemOdevler = new ArrayList<OdevNot>();
        Donem sonDonem = sonDonemVer();

        String sonOdevlerSorgu = "select distinct odevnot.* from odevnot, dersogretimuyesi "
                + "where odevnot.gonderitipi=1 and "
                + "dersogretimuyesi.ogretimuyesiid = "+ogretim.getId()+" and "
                + "dersogretimuyesi.donemid ="+sonDonem.getId()+" and "
                + "odevnot.dersid=" + ders.getId();
        System.out.print("soruggggg: " + sonOdevlerSorgu);
        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(sonOdevlerSorgu);
            while (rs.next()) {
                OdevNot ara = new OdevNot();
                ara = odevVer(rs.getInt("idodevnot"));
                sonDonemOdevler.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return sonDonemOdevler;
    }
    
    /**
     * Öğretim üyesinin parametre olarak verilen dersi son dönem içerisinde
     * verip vermediği konusunda bilgi veren metot.
     * 
     * @param   ogretim  Hakkında verdiği ders kontrolü yapılacak olan öğretim
     * üyesi nesnesi
     * @param   ders    Öğretim üyesinin son dönem verip vermediği incelenecek
     * ders nesnesi
     * 
     * @return Eğer {@code ders} nesnesi, {@code ogretim uyesi} tarafından son
     * dönem içinde veriliyorsa {@code true} döndürülür. Aksi durumda {@code false}
     * döndürülür.
     * 
     */
    public boolean ogretimDersiVeriyorMu(OgretimUyesi ogretim, Ders ders) {
        ArrayList<Ders> sonDersler = ogretimSonVerilenDerslerVer(ogretim);
        for (Ders d : sonDersler) {
            if (d.getId() == ders.getId()) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * Öğretim üyesinin ödevleri listelerken kullanılan metot.
     * Bu metot ile öğretim üyesinin verdiği ödev incelenirken o ödeve gönderilen
     * yanıtları listelemek için kullanılır.
     * 
     * @param   odev    Kendisine gönderilen yanıtların listelenmesi istenen ödev
     * 
     * @return  Öğretim üyesinin verdiği ödeve gönderilen yanıtları barındıran liste
     * döndürülür. Listedeki elemanlar {@link OdevOgrenci} tipindedir.
     * 
     */
    public ArrayList<OdevOgrenci> odevCevaplariVer(OdevNot odev) {
        Statement sorgu = null;
        ArrayList<OdevOgrenci> ogrenciOdevCevaplari = new ArrayList<OdevOgrenci>();
        // Donem sonDonem = sonDonemVer();

        String odevlerSorgu = "select * from odevogrenci where odevid ="+odev.getId();

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(odevlerSorgu);
            while (rs.next()) {
                OdevOgrenci ara = new OdevOgrenci();
                ara.setId(rs.getInt("idodevogrenci"));
                ara.setOdev(odevVer(rs.getInt("odevid")));
                ara.setGonderen(ogrenciVer(rs.getInt("gonderenid")));
                ara.setBaslik(rs.getString("odevadi"));
                ara.setDosyaYolu(rs.getString("dosyayolu"));
                ara.setAciklama(rs.getString("aciklama"));
                ogrenciOdevCevaplari.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return ogrenciOdevCevaplari;
    }
    
    /**
     * Öğretim üyesinin veritabanına ödev bilgilerini yazmasını sağlayan metot.
     * Ödevler için gonderi tipi 1, çalışma notu için ise 2'dir. Bu metotta gonderi tipi
     * otomatik olarak 1 alınmıştır. Onun dışında kalan bölgeler çalışma notu 
     * yükleme ile aynıdır.
     * 
     * @param   odev    Veritabanına eklenecek ödev ile ilgili bilgileri barındıran
     * nesne. Tipi {@link OdevNot} şeklindedir.
     */
    public void ogretimOdevGonder(OdevNot odev) {
        Statement sorgu = null;
        String odevKaydetmeSorgu = "insert into odevnot "
                + "(dersid, gonderenid, odevadi, gonderitipi, dosyayolu, aciklama) "
                + "values (" + odev.getDers().getId() + "," + odev.getGonderen().getId() + ", "
                + "'" + odev.getBaslik() + "', 1, '" + odev.getDosyaYolu() + "', "
                + "'" + odev.getAciklama() + "');";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            sorgu.executeUpdate(odevKaydetmeSorgu);
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
    }
    
        /**
     * Öğretim üyesinin son dönemde verdiği derse ait çalışma notlarını listeyen metot.
     * 
     * Tüm işlemler son dönem gözetilerek yapılır.
     * 
     * @param   ogretim     Verdiği çalışma notları listelenecek olan öğretim üyesi nesnesi
     * @param   ders    Kendisine yüklenmiş olan çalışma notları verilecek olan ders nesnesi
     * 
     * @return  Öğretim üyesinin son dönemde verdiği çalışma notları bir liste içerisinde
     * döndürülür. Bu listedeki her eleman {@link OdevNot} tipindedir
     * 
     */
    public ArrayList<OdevNot> ogretimDersinCalismaNotlariVer(OgretimUyesi ogretim, Ders ders) {
        Statement sorgu = null;
        ArrayList<OdevNot> sonDonemCalismaNotlari = new ArrayList<OdevNot>();
        Donem sonDonem = sonDonemVer();

        String sonCalismaNotSorgu = "select distinct odevnot.* from odevnot, dersogretimuyesi "
                + "where odevnot.gonderitipi=2 and "
                + "dersogretimuyesi.ogretimuyesiid = "+ogretim.getId()+" and "
                + "dersogretimuyesi.donemid ="+sonDonem.getId()+" and "
                + "odevnot.dersid=" + ders.getId();

        baglan();
        
        System.out.println("sorgu : " + sonCalismaNotSorgu);

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(sonCalismaNotSorgu);
            while (rs.next()) {
                OdevNot ara = new OdevNot();
                ara = calismaNotuVer(rs.getInt("idodevnot"));
                sonDonemCalismaNotlari.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return sonDonemCalismaNotlari;
    }

    
    /**
     * Öğretim üyesinin veritabanına çalışma notu bilgilerini yazmasını sağlayan metot.
     * Ödevler için gonderi tipi 1, çalışma notu için ise 2'dir. Bu metotta gonderi tipi
     * otomatik olarak 2 alınmıştır. Onun dışında kalan bölgeler ödev yükleme ile 
     * aynıdır.
     * 
     * @param   not    Veritabanına eklenecek çalışma notu ile ilgili bilgileri 
     * barındıran nesne. Tipi {@link OdevNot} şeklindedir.
     * 
     */
    public void ogretimCalismaNotGonder(OdevNot not) {
        Statement sorgu = null;
        String notKaydetmeSorgu = "insert into odevnot "
                + "(dersid, gonderenid, odevadi, gonderitipi, dosyayolu, aciklama) "
                + "values (" + not.getDers().getId() + "," + not.getGonderen().getId() + ", "
                + "'" + not.getBaslik() + "', 2, '" + not.getDosyaYolu() + "', "
                + "'" + not.getAciklama() + "');";

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            sorgu.executeUpdate(notKaydetmeSorgu);
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
    }
    
    /**
     * Parametre olarak verilen öğretim üyesinin danışmanlığını alan öğrenci
     * listesini veren metot.
     * 
     * @param   ogretim Danışman bilgilerini barındıran öğretim üyesi nesnesi
     * 
     * @return  Danışmanlık alan öğrencilerin listesini döndüren metot. {@link Ogrenci}
     * tipinde elemanlar barındıran liste {@link ArrayList} tipindedir.
     * 
     */
    public ArrayList<Ogrenci> ogretimDanismaninOgrenciVer(OgretimUyesi ogretim) {      
        Statement sorgu = null;
        ArrayList<Ogrenci> danismaninOgrencileri = new ArrayList<Ogrenci>();

        String danismanSorgu = "select * from ogrenci where danismanid = "+ ogretim.getId();

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            ResultSet rs = sorgu.executeQuery(danismanSorgu);
            while (rs.next()) {
                Ogrenci ara = new Ogrenci();
                ara=ogrenciVer(rs.getInt("idogrenci"));
                danismaninOgrencileri.add(ara);
            }
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();

        return danismaninOgrencileri;
    }
    
    /**
     * Öğrencinin kişisel bilgilerinin güncellemesini yapan metot.
     * 
     * Öğretim üyesi danışmanlığını yaptığı öğrencinin bilgilerini değiştirmek
     * için bu metodu kullanır.
     * 
     * @param   ogrenci     Kişisel bilgileri güncellenecek olan öğrenci nesnesi
     * 
     */
    public void ogretimOgrenciBilgiGuncelle(Ogrenci ogrenci) {
        Statement sorgu = null;

        String bilgiSorgu = "update ogrenci set adi='" + ogrenci.getAd() + "', soyadi='"+ogrenci.getSoyad()+"', "
                + "iletisim='"+ogrenci.getIletisim()+"'"
                + " where idogrenci=" + ogrenci.getId();

        baglan();

        try {
            sorgu = baglanti.createStatement();
        } catch (SQLException ex) {
            System.out.println("sorgu hatası");
        }

        try {
            sorgu.executeUpdate(bilgiSorgu);
        } catch (SQLException ex) {
            System.out.println("sql hata: " + ex.toString());
        }

        baglantiKes();
    }
    
}
